import http from 'wechat-http'

// 接口基础地址
http.baseURL = 'https://live-api.itheima.net'

http.intercept.request = config => {
  // config 就是请求配置
  // console.log(config)
  const app = getApp()

  // 这样写等于完全放弃了用户携带的请求头, 不可取
  // config.header = {
  //   Authorization: `Bearer ${app.token}`
  // }
  // config 本来就携带了请求头 Authorization, 那拦截器就不要加 Authorization
  // config.header = {
  //   ...config.header, // 用户携带的请求头要放在后面, 才能实现用户携带请求头权重更高的效果
  //   Authorization: `Bearer ${app.token}`
  // }
  // 用户带了 Authorization 就用用户的, 没带就用拦截器的
  config.header = {
    Authorization: `Bearer ${app.token}`,
    ...config.header
  }
  return config
}

http.intercept.response = res => {
  // 就是用户第一次发请求的所有配置
  // console.log(res.config)
  if (res.data.code === 401) {
    // 如果是 401 并且请求的地址是 /refreshToken 此时说明 refreshToken 也过期了
    if (res.config.url.includes('/refreshToken')) {
      // 获取当前页面栈
      const currentPage = getCurrentPages()[0]
      // 跳转到登录页
      wx.redirectTo({
        url: '/pages/login/index?redirectURL=/' + currentPage.route
      })
      // 清除本地的 token 和 refreshToken
      getApp().setToken('token', '')
      getApp().setToken('refreshToken', '')
      return
    }
    // 说明 token 过期了
    // 获取到 refreshToken
    const app = getApp()
    const { refreshToken } = app
    // console.log(refreshToken)
    // 发请求获取最新的 token
    return http({
      url: '/refreshToken',
      method: 'post',
      header: {
        Authorization: `Bearer ${refreshToken}`
      }
    }).then(({ code, data }) => {
      if (code !== 10000) return wx.utils.toast('token 获取失败')
      // console.log(code, data)
      // 将两个 token 都存储到 app 和本地
      app.setToken('token', data.token)
      app.setToken('refreshToken', data.refreshToken)
      // 还需要将用户第一次请求也一起发出去
      // 请求之前将 token 更新为最新的
      res.config.header.Authorization = 'Bearer ' + data.token
      return http(res.config)
    })
  }
  // 数据脱壳
  return res.data
}

// 作为模块导出
export default http

// 也可挂载到 wx 全局命名空间
wx.http = http